#include <stdio.h>
#include <assert.h>

// 该代码是对strlen的模拟实现
// strlen函数的功能为: 统计字符串的元素个数(不包括\0转义字符)
// 通过对功能的解读,我们可以使用两种方法来进行实现
// 第一种是计算机法 第二种是递归法

size_t mystrlen1 (const char* str) // 这里的const是为了保护源数据不被修改
{

    assert (str) ; // 断言: 防止指针为空指针

    int num = 0 ;

    while (*(str + num) != '\0') // 当指针运算后解引用之后,值不是'\0'的继续循环
    {

        num++ ; // 每当循环运行时,都会计数一次

    }
    
    return num ; // 当运算完之后返回值

}

size_t mystrlen2 (const char* str) // 这里可以使用递归,因为我们可以将一整个函数每次都分解成一个字符加一整块,最后如果统计到'\0'的时候,我们就可以返回函数
{

    assert (str) ;

    if ((*str == '\0')) // 设立递归停止的条件
    {

        return 0 ;

    }

    else
    {

        return 1 + mystrlen2 (str + 1) ;

    }
    
}

int main ()
{

    char str [] = {"hello world"} ;

    size_t n1 = mystrlen1 (str) ;

    printf ("%zd\n" , n1) ;

    size_t n2 = mystrlen2 (str) ;

    printf ("%zd\n" , n2) ;

    return 0 ;

}